package com.edu.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

/*
 * @Author:mx
 * @Date:2025/11/3-9:25:38
 */
@Component
//@Scope("singleton")
//@Lazy(false)
public class User {

    //直接把@Value 放在 属性上会进行注入 通过暴力反射完成
    //@Value("1")
    private int userId;

    @Value("${user.username}")
    private String username;

    @Value("${user.password}")
    private String password;

    private int age;


    /*

        引用型的自动注入
    *   @Autowired
    *       1.提供者是  Spring框架
    *       2.默认按照 指定类型 来进行自动注入
    *       3.如果同类型的一个都没有 会报错 (required=false 可以不强制注入)
    *       4.同类型有一个 直接注入
    *       5.同类型有多个 会按照 属性名进行注入(没有同名的会报错)
    *       6 @Autowired 可以 和 @Qualifier(beanId) 指定id进行注入
    *       7 建议 @Autowired 用在 setter方法上 不直接用在属性上
    *
    *
    *   @Resource
    *       1.提供者是 java
    *       2.优先按照名字 进行 自动注入，有同名的直接注入
            3.如果没有同名的bean ，会找同类型的bean
            4.如果同名的没有 同类型的有多个 那么会报错 @Resource(name="beanId")
    * */

    @Resource
    private Car car;

    public Car getCar() {
        return car;
    }

//    @Autowired(required = false)
//    @Qualifier("c2")
    public void setCar(Car car) {
        this.car = car;
    }

    public int getUserId() {
        return userId;
    }

    @Value("12")
    public void setUserId( int userId) {
        System.out.println("执行了 userId的 set方法");
        this.userId = userId;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", car=" + car +
                '}';
    }


//    public User(@Value("15")int userId) {
//        System.out.println("执行了有参数构造方法");
//        this.userId = userId;
//    }
//
    public User() {
        System.out.println("执行了User的无参构造方法");
    }

    @PostConstruct
    public void myInit(){
        System.out.println("执行了自定义的初始化方法");
    }


    @PreDestroy
    public void myDestroy(){
        System.out.println("执行了自定义的销毁方法");
    }
}
